#pygame.py
#导入相应模块
import pygame
from pygame.locals import *
import time,random

class HeroPlane:
	'''玩家飞机'''
	def __init__(self,screen_temp):
		self.x=200
		self.y=400
		self.screen=screen_temp
		self.image=pygame.image.load('./image/me.png')
		self.bullet_list=[]  #玩家的子弹列表
	def display(self):
		'''绘制玩家飞机'''

		for b in self.bullet_list:
			b.display()
			if b.move():
				self.bullet_list.remove(b)
		self.screen.blit(self.image,(self.x,self.y))
	def move_left(self):
		'''左移飞机'''
		self.x-=5
		if self.x<=0:
			self.x=0	
	def move_right(self):
		'''右移飞机'''
		self.x+=5
		if self.x>=(512-106):
			self.x=	(512-106)
	def fire(self):
		'''子弹发出'''
		self.bullet_list.append(bullet(self.screen,self.x,self.y))
		#print(len(self.bullet_list))


class bullet:
	'''子弹类'''
	def __init__(self,screen_temp,x,y):
		self.x=x+53
		self.y=y
		self.screen=screen_temp
		self.image=pygame.image.load('./image/pd.png')

	def display(self):
		'''绘制子弹'''
		self.screen.blit(self.image,(self.x,self.y))
	
	def move(self):
		self.y-=10
		if self.y<=-20:
			return True

class wow:
	'''爆炸类'''
	def __init__(self,screen_temp,x,y):
		self.x=x
		self.y=y
		self.screen=screen_temp
		#爆炸图列表，4张图
		self.image=[pygame.image.load('./image/bo0.png'),
		            pygame.image.load('./image/bo1.png'),
		            pygame.image.load('./image/bo1.png'),
		            pygame.image.load('./image/bo1.png')]		
	def display(self):
		'''绘制爆炸图'''
		for i in self.image:
			self.screen.blit(i,(self.x,self.y))



class Enbullet:
	'''敌机子弹类'''
	def __init__(self,screen_temp,x,y,hero):
		self.x=x+53
		self.y=y+70
		self.screen=screen_temp
		self.image=pygame.image.load('./image/pd2.png')
		
		self.hero=hero
	def display(self):
		'''绘制敌机子弹'''

		self.screen.blit(self.image,(self.x,self.y))

	def move(self,hero):
		self.y+=6
		rl=[0,False]#定义调用返回列表，[0=玩家Over,1=玩家存在   False/True:敌机子弹是否出界
		if self.y>=568:
			rl[1]=True
			#检测和玩家飞机的碰撞
			
		if self.x>hero.x and self.x<hero.x+106 and self.y>hero.y and self.y<=hero.y+76:
			del hero
			rl[0]=1
		
		return rl

		


class EnemyPlane:
	'''敌机类'''
	def __init__(self,screen_temp):
		self.x=random.choice(range(408))
		self.y=-75
		self.screen=screen_temp
		self.image=pygame.image.load('./image/e'+str(random.choice(range(3)))+'.png')

		self.Enbullet_list=[] #敌机子弹列表


	def display(self,hero):
		'''绘制敌机'''
		isover=False
		for b in self.Enbullet_list:
			b.display()
			if b.move(hero)[1]: #敌机子弹出界,删除敌机子弹
				self.Enbullet_list.remove(b)
			if b.move(hero)[0]==1:#玩家Over,显示爆炸场面，返回True
				boo=wow(self.screen,hero.x+12,hero.y+5)
				boo.display()
				isover=True

		self.screen.blit(self.image,(self.x,self.y))
		return isover#  返回玩家是否 Over

	def move(self,hero):
		self.y+=3
        #出屏幕了移删除敌机
		if self.y>568:
			return True

		#遍历所有子弹
		for bo in hero.bullet_list:
			
			if bo.x>self.x+12 and bo.x<self.x+92 and bo.y>self.y+20 and bo.y<self.y+60:
				#敌机Over,删除敌机，显示爆炸场面，返回True
				hero.bullet_list.remove(bo)
				boo=wow(self.screen,self.x+12,self.y+20)
				boo.display()
				return True

	def fire(self,hero):
		'''子弹发出'''
		self.Enbullet_list.append(Enbullet(self.screen,self.x,self.y,hero))
		#print('敌机子弹列表长度：',len(self.Enbullet_list))


def enkey(en,hero):
	'''敌机发射子弹，en:敌机列表，hero:玩家'''	

	endj=random.choice(range(len(en)))#随机选择要发射子弹的敌机
	if random.choice(range(10))==1:#发射子弹的频率
		en[endj].fire(hero)



def quitk():
	'''窗口关闭按钮处理，执行退出操作'''
	for event in pygame.event.get():
		if event.type==QUIT:
			print('exit()')
			exit()

def key_control(hero_temp):
	'''键盘控制函数'''
	quitk()#退出操作函数


	#获取按键信息
	pressed_keys=pygame.key.get_pressed()
	#print(pressed_keys)
	#做判断，并执行对象操作
	if pressed_keys[K_LEFT] or pressed_keys[K_a]:
		print('Left....')
		hero_temp.move_left()
	elif pressed_keys[K_RIGHT] or pressed_keys[K_d]:
		print('Rithg.....')
		hero_temp.move_right()
	if pressed_keys[K_SPACE]:
		print('Space....')	
		hero_temp.fire()	


def main():
	'''主程序函数'''
	#创建游戏窗口
	screen=pygame.display.set_mode((512,568),0,0)

    #创建游戏背景
	backgroud=pygame.image.load('./image/bg2.jpg')
    
    #overimg=pygame.image.load('./image/end1.png')
	#创建玩家飞机
	hero=HeroPlane(screen)

	enemylist=[]#存放敌机列表
	m=-968
	gmover=False
	while True:
		if not gmover:#游戏没结束
	    #绘制画面
			screen.blit(backgroud,(0,m))
			m+=2
			if m>=-200:
				m=-968
		else:#游戏结束
			screen.blit(pygame.image.load('./image/end1.png'),(0,0))
			pygame.display.update()
			quitk()
			continue
		
		#绘制玩家飞机
		hero.display()
		#执行键盘控制
		key_control(hero)

		#随机绘制敌机
		if random.choice(range(50))==10:
			enemylist.append(EnemyPlane(screen))
		#遍历敌机并绘制移动
		for em in enemylist:
			if not em.display(hero):#游戏没结束
				if em.move(hero):
					enemylist.remove(em)
			else: #游戏结束
				gmover=True		
			
	
		if len(enemylist)>0:#敌机列表长度,调用敌机发射子弹函数
			enkey(enemylist,hero)
	    #更新显示
		pygame.display.update()
		#定时刷新
		time.sleep(0.04)






#是否是主运行程序，并调用
if __name__ =="__main__":
	main()
